<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1.0 字面量
        var obj = {
            name: "张三"
        }

        // 2.0 内置构造函数
        var obj = new Object();
        obj.name = "张三";

        // 3.0 工厂模式
        function Factory(name, age) {
            var obj = {};
            obj.name = name;
            obj.age = age;
            return obj;
        }
        var obj = Factory("张三", 20);

        // 4.0 自定义构造函数
        function Person(name, age) {
            this.name = name;
            this.age = age;
            return {
                name: "李四"
            }
        }

        /*
            1. 在堆空间中创建一个空对象
            2. 将构造函数中的this指向该对象
            3. 对象的原型执行函数的原型
            4. 返回该对象的地址，一般给变量接收存储在栈空间上
        */

        function mynew(name, age) {
            var obj = {};
            var res = Person.call(obj, name, age);
            obj.__proto__ = Person.prototype;
            // 如果没有返还，那么就返还this 也就是这个对象 。 如果有返还就返还用户返还的值
            if (typeof res == "undefined") {
                return obj;
            } else {
                return res;
            }
        }
    </script>
</body>

</html>